• Platform decalration clash: The following declarations have the same JVM signature

    平台声明冲突:以下声明具有相同的 JVM 签名,在相同的声明中包含多个相同的 set/get 等方法。比如 class A 中有 userName 成员,在使用中又定义了一个 getUserName() 函数

  • Out-projected type ‘KMutableProperty1’ prohibits the use of ‘public abstract fun set(receiver: T, value: R): Unit defined in kotlin.reflect.KMutableProperty1’

    因为 kotlin 泛型类型严格导致某些情况下反射代码编译不通过
    你绝对想不到 Kotlin 泛型给反射留下了怎样的坑!

  • Error:Execution failed for task ‘:app:kaptDebugKotlin’

    这个问题原因很多,当时完全没有注意,后面才注意到在 gradle console 窗口中可以查找对应的错误信息

  • === 和 == 的区别
    === 引用相等 == 结构相等, 相当于 java 中 == 和 equals
    的区别

  • kotlin.UninitializedPropertyAccessException: lateinit property mapView has not been initialized

    主要问题是使用过了 lateinit 属性,导致在 ondestroy 用到 mapview 时出现未初始化 mapview 的问题。解决:将使用 mapview 提到 super.ondestory 之前(也可以使用 by lazy{} 初始化 mapview )。

    区别 lateinit 与 by lazy{…}

    lazy { … }代表只能用于val属性,而lateinit只能用于var,因为它不能编译到final字段,因此不能保证不变性;

    lateinit var具有存储值的后备字段,by lazy { … }创建一个委托对象,其中存储一次计算的值,将对代理实例的引用存储在类对象中,并为与委托实例一起使用的属性生成getter。所以如果你需要在课堂中存在的支持字段,请使用lateinit;

    除了val之外,lateinit不能用于可空属性和Java原语类型(这是因为null用于未初始化的值);

    lateinit var可以从对象被看到的任何地方被初始化。从一个框架代码的内部,多个初始化方案是可能的单一类的不同对象。 by lazy { … }反过来又定义了属性的唯一初始化器,只能通过覆盖子类中的属性进行更改。如果您希望以预先未知的方式从外部初始化属性,请使用lateinit。

    另外,还有一个方法没有提到Delegates.notNull(),它适用于non-null属性的延迟初始化,包括Java原始类型的属性。